<?php
namespace core\filter;

use core\utils\Bean;

abstract class Filter implements Bean {
    protected $module = '';
    protected $controller = '/.*/';
    protected $action = '/.*/';

    /**
     * @var int 排序， 如果多个Filter都对同一个请求发出响应，
     * 那么就根据这个排序顺序(从小到大)进行调用调度，如果对执行顺序没有要求，那就保留默认就好了。
     * 如果是before方法，那么就按照 $sort 从小到大执行
     * 其他三个方法就按照 $sort 从大到小执行(就是和before的执行顺序相反)
     */
    protected $sort = 0;

    public function match(string $module, string $controller, string $action) : bool {

        if (($module === $this->module || (isPattern($this->module) && preg_match($this->module, $module))) &&
            ($controller === $this->controller || (isPattern($this->controller) && preg_match($this->controller, $controller))) &&
            ($action === $this->action || (isPattern($this->action) && preg_match($this->action, $action))))
            return true;
        return false;
    }




    public function getSort()
    {
        return $this->sort;
    }

    public function setSort($sort): void
    {
        $this->sort = $sort;
    }


    public function before(){}

    /**
     * finally
     */
    public function after(){}

    public function afterThrowing(){}

    /**
     * 这个方法好像就只有在 renderJson 的时候才有用
     */
    public function afterReturning(){}
}